const express = require('express');
const { Low } = require('lowdb');
const { JSONFile } = require('lowdb/node');
const { nanoid } = require('nanoid');
const cors = require('cors');
const path = require('path');

const app = express();
const PORT = process.env.PORT || 3000;

// 数据库配置
const adapter = new JSONFile('db.json');
const db = new Low(adapter);

// 初始化数据库
async function initDB() {
  await db.read();
  db.data ||= { urls: [], stats: { totalUrls: 0, totalClicks: 0 } };
  await db.write();
}

// 中间件
app.use(cors());
app.use(express.json());
app.use(express.static('public'));

// 首页
app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname, 'public', 'index.html'));
});

// 生成短链
app.post('/api/shorten', async (req, res) => {
  const { url, customCode } = req.body;
  
  if (!url) {
    return res.status(400).json({ error: '请提供URL' });
  }

  // 验证URL格式
  try {
    new URL(url);
  } catch {
    return res.status(400).json({ error: '无效的URL格式' });
  }

  await db.read();
  
  let shortCode;
  
  // 如果使用自定义短码
  if (customCode) {
    if (customCode.length < 3 || customCode.length > 20) {
      return res.status(400).json({ error: '自定义短码长度应在3-20字符之间' });
    }
    
    if (db.data.urls.find(u => u.shortCode === customCode)) {
      return res.status(400).json({ error: '该短码已被使用' });
    }
    
    shortCode = customCode;
  } else {
    // 自动生成短码
    do {
      shortCode = nanoid(6);
    } while (db.data.urls.find(u => u.shortCode === shortCode));
  }

  const shortUrl = {
    id: nanoid(),
    originalUrl: url,
    shortCode,
    clicks: 0,
    createdAt: new Date().toISOString()
  };

  db.data.urls.push(shortUrl);
  db.data.stats.totalUrls += 1;
  await db.write();

  res.json({
    shortUrl: `https://${req.get('host')}/${shortCode}`,
    shortCode,
    originalUrl: url
  });
});

// 重定向短链
app.get('/:code', async (req, res) => {
  const { code } = req.params;
  
  await db.read();
  const url = db.data.urls.find(u => u.shortCode === code);
  
  if (!url) {
    return res.status(404).send('短链不存在');
  }

  // 更新点击统计
  url.clicks += 1;
  db.data.stats.totalClicks += 1;
  await db.write();

  res.redirect(302, url.originalUrl);
});

// 获取统计信息
app.get('/api/stats', async (req, res) => {
  await db.read();
  res.json(db.data.stats);
});

// 启动服务器
async function start() {
  await initDB();
  app.listen(PORT, () => {
    console.log(`服务器运行在 http://localhost:${PORT}`);
  });
}

start().catch(console.error);
